package parser

import values.ValueType

class Caster {

   /**
   * Convierte el valor (seguramente string) al tipo indicado.
   * @param value
   * @param to
   * @return
   */
   static public Object cast(Object value, ValueType to)
   {
      //println "CASTER >> " + to
      
      // Con esto me tira: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
      //return value.asType(to.clazz)
      //def toMethod = 'to'+to.clazz.getSimpleName()
      //return value."$toMethod"()
      
      if (to == ValueType.COLLECTION)
      {
         //println "CAST A COLLECTION"
         //println value.class // ArrayList de String
         //println value
         return value // No hago nada, devuelvo la misma lista...
      }
      
      // Si value es cualquier cosa, intento pasarlo a string y ver que onda
      // llam al otro cast
      return cast(value.toString(), to)
   }
   
   /**
    * Especial de cast para entrada string
    * @param value
    * @param to
    * @return
    */
   static public Object cast(String value, ValueType to)
   {
      //println "CASTER 2 >> " + to
      
      switch (to.clazz.getSimpleName())
      {
         case 'Integer':
            // TODO: se le puede preguntar isInteger
            return Integer.parseInt(value)
         break
         case 'Float':
            return Float.parseFloat(value)
         break
         case 'String':
            return value
         break
         // TODO: Date (para Date necesito el formato!)
         case 'Date':
            // http://groovy.codehaus.org/groovy-jdk/java/util/Date.html#parseToStringDate(java.lang.String)
            // Parse a String matching the pattern EEE MMM dd HH:mm:ss zzz yyyy containing US-locale-constants only (e.g. Sat for Saturdays). Such a string is generated by the toString method of Date
            //return Date.parseToStringDate(value)
         
            // Detecta el formato ISO 8601
            String format = util.DateFormats.findFormat(value)
            
            println "Caster date format: " + format
            
            java.text.DateFormat df = new java.text.SimpleDateFormat(format)
            return df.parse(value)
            
         break
         case 'Boolean':
            return Boolean.parseBoolean(value)
         break
         default:
            throw new Exception('Tipo de valor no soportado: '+ to.clazz.getSimpleName())
      }
   }
}